package databaseHandling;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import javax.swing.ImageIcon;
import model.Kampagne;
import model.KampagnePeriode;
import model.Kategori;
import model.TilknyttetKamp;
import model.Vare;
import model.internt.VareSalg;
import utility.DateFormatter;

/**
 *
 * @author Jeppe
 */
public abstract class KampagneHandler {

    public static ArrayList<Kampagne> hentAlleKampagner() throws SQLException, ParseException {
        ArrayList<Kampagne> kampagneList = new ArrayList<>();
        String sql = "CALL hentKampagner('" + DateFormatter.format(Calendar.getInstance(), true) + "')";
        ResultSet rs = DatabaseHandler.getInstance().select(sql);
        while (rs.next()) {
            Calendar startDato = DateFormatter.parse(rs.getString("kamStartDato"), true);
            Calendar slutDato = DateFormatter.parse(rs.getString("kamSlutDato"), true);
            kampagneList.add(new Kampagne(rs.getInt("kamID"),rs.getString("kamBesked"), new KampagnePeriode(startDato, slutDato)));
        }

        for (Kampagne kampagne : kampagneList) {
            kampagne.setTilknyttetKampList(hentTilknyttetKamp(kampagne));
        }
        return kampagneList;
    }

    public static ArrayList<Kampagne> hentAlleKampagnerMedDisseVarer(ArrayList<VareSalg> vareSalgsList) throws SQLException, ParseException {
        ArrayList<Kampagne> kampagneList = new ArrayList<>();
        for (int i = 0; i < vareSalgsList.size(); i++) {            
            String sql = "CALL hentTilknyttetKampVedVareOgAntal('" + DateFormatter.format(Calendar.getInstance(), true) + "', '" + vareSalgsList.get(i).getVare().getVareEAN() + "', "+vareSalgsList.get(i).getAntal()+")";
            if(vareSalgsList.get(i).getAntal() == 1){
                sql = "CALL hentVareKampVedVare('"+vareSalgsList.get(i).getVare().getVareEAN()+"')";
            }
            ResultSet rs = DatabaseHandler.getInstance().select(sql);
            while (rs.next()) {
                Calendar startDato = DateFormatter.parse(rs.getString("kaPeStartDato"), true);
                Calendar slutDato = DateFormatter.parse(rs.getString("kaPeSlutDato"), true);
                kampagneList.add(new Kampagne(rs.getInt("kamID"), rs.getString("kamBesked"), new KampagnePeriode(rs.getInt("kaPeID"), startDato, slutDato)));
            }
        }
        for (Kampagne kampagne : kampagneList) {
            kampagne.setTilknyttetKampList(hentTilknyttetKamp(kampagne));
        }
        return kampagneList;
    }

    public static ArrayList<TilknyttetKamp> hentTilknyttetKamp(Kampagne kampagne) throws SQLException {
        ArrayList<TilknyttetKamp> tilknyttetKampList = new ArrayList<>();
        String sql = "CALL hentTilknyttetKampVedKamID(" + kampagne.getID() + ")";
        ResultSet rs = DatabaseHandler.getInstance().select(sql);
        while (rs.next()) {
            tilknyttetKampList.add(new TilknyttetKamp(rs.getInt("tiKaID"), rs.getInt("tiKaAntal"), rs.getInt("tiKaStkPris")));
        }
        for (TilknyttetKamp tilknyttetKamp : tilknyttetKampList) {
            hentVarerITilknyttetKamp(tilknyttetKamp);
        }
        return tilknyttetKampList;
    }
    
    public static ArrayList<Vare> hentVarerITilknyttetKamp(TilknyttetKamp tilknyttetKamp) throws SQLException {
        ArrayList<Vare> vareList = new ArrayList<>();
        String sql = "CALL hentVarerITilknyttetKampVedTilknyttetKampID(" + tilknyttetKamp.getID() + ")";
        ResultSet rs = DatabaseHandler.getInstance().select(sql);
        while(rs.next()){
            vareList.add(new Vare(rs.getString("varEan"), rs.getString("varNavn"), rs.getInt("varPris"), rs.getString("varBeskrivelse"), new ImageIcon(KategoriHandler.class.getResource(rs.getString("varIconURL"))), new Kategori(rs.getInt("katID"), rs.getString("katNavn"), new ImageIcon(KategoriHandler.class.getResource(rs.getString("katIconUrl"))))));
        }
        return vareList;
    }
}
